package com.ruoyi.business.rpc;

import com.ruoyi.business.config.FeignConfig;
import com.ruoyi.business.domain.response.BinghuCallMircoResponse;
import com.ruoyi.business.domain.response.BinghuDeviceListResponse;
import com.ruoyi.business.domain.response.BinghuTokenResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 冰狐服务远程调用接口
 * 
 * 接口说明：
 * 1. 提供冰狐平台API的访问能力
 * 2. 所有接口直接返回对应的响应对象，无需手动解析
 * 3. 异常由FeignErrorDecoder统一处理
 * 4. 配置由FeignConfig提供
 */
@FeignClient(
    name = "binghuService", 
    url = "${feign.rpc.binghuService}", 
    configuration = FeignConfig.class
)
public interface RemoteBinghuRpc {

    /**
     * 1. 获取冰狐访问令牌
     * 
     * 使用客户端凭证获取访问令牌，用于后续API调用的身份验证
     *
     * @param clientKey    客户端标识
     * @param clientSecret 客户端密钥
     * @return 包含访问令牌、刷新令牌和有效期的响应对象
     */
    @GetMapping(value = "/api/get_token?clientKey={clientKey}&clientSecret={clientSecret}")
    BinghuTokenResponse getToken(
            @PathVariable("clientKey") String clientKey, 
            @PathVariable("clientSecret") String clientSecret);

    /**
     * 2. 刷新访问令牌
     * 
     * 当访问令牌过期时，使用刷新令牌获取新的访问令牌
     *
     * @param clientKey    客户端标识
     * @param refreshToken 刷新令牌
     * @return 包含新的访问令牌、刷新令牌和有效期的响应对象
     */
    @GetMapping(
            value = "/api/refresh_token?clientKey={clientKey}&refreshToken={refreshToken}", 
            consumes = MediaType.APPLICATION_JSON_VALUE
    )
    BinghuTokenResponse refreshToken(
            @PathVariable("clientKey") String clientKey, 
            @PathVariable("refreshToken") String refreshToken);

    /**
     * 3. 调用冰狐微服务
     * 
     * 使用访问令牌调用冰狐平台上的微服务
     *
     * @param clientKey   客户端标识
     * @param accessToken 访问令牌
     * @param name        微服务名称
     * @param isDev       是否为开发环境模式
     * @param param       微服务参数(需要URL编码)
     * @return 微服务调用结果响应对象
     */
    @GetMapping(
            value = "/api/call_micro_service?clientKey={clientKey}&accessToken={accessToken}&name={name}&isDev={isDev}&param={param}"
    )
    BinghuCallMircoResponse callMicroService(
            @PathVariable("clientKey") String clientKey, 
            @PathVariable("accessToken") String accessToken, 
            @PathVariable("name") String name, 
            @PathVariable("isDev") Boolean isDev, 
            @PathVariable("param") String param);

    /**
     * 4. 获取设备列表
     * 
     * 获取指定用户关联的所有设备列表
     *
     * @param clientKey   客户端标识
     * @param accessToken 访问令牌
     * @param openId      用户唯一标识
     * @return 设备列表响应对象
     */
    @GetMapping(value = "/api/device/list?clientKey={clientKey}&accessToken={accessToken}&openId={openId}")
    BinghuDeviceListResponse getDeviceList(
            @PathVariable("clientKey") String clientKey, 
            @PathVariable("accessToken") String accessToken, 
            @PathVariable("openId") String openId);
}
